﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Chilis.Marketing.Common;
using System.Data.SqlClient;
using Chilis.Marketing.Business.Entity;
using System.Data;

namespace Chilis.Marketing.Data.Access
{
    public class DAMaterial : ConexionBD
    {
        #region ATRIBUTOS

        private SqlCommand cmd;
        ChilisDataContext chilisDataContext = new ChilisDataContext();

        #endregion

        #region CONSTRUCTOR
        #endregion

        #region PROPIEDADES
        #endregion

        #region METODOS

        /// <summary>
        /// Método              : insertarMaterial
        /// Descripción         : Inserta Material en la BD
        /// Fecha Creacion      : 20/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 20/03/2012
        /// </summary>
        /// <param name="materialBE">Entidad que representa el Material</param>
        /// <param name="transaccionIniciada">Indicador de Transaccion Iniciada</param>
        /// <returns>Retorna el Id del Material insertado</returns>
        public int? insertarMaterial(BEMaterial materialBE,
                                    bool transaccionIniciada)
        {
            int? codInsertado = 0;

            try
            {
                int? idUnidad = null;
                if (materialBE.Unidad != null)
                {
                    idUnidad = materialBE.Unidad.IdUnidad;
                }

                decimal? tempCosto = (decimal)materialBE.Costo;
                int? tempEstado = (int)materialBE.Estado;

                chilisDataContext.spInsertaMaterial(ref codInsertado,
                                                    materialBE.Descripcion,
                                                    idUnidad,
                                                    tempCosto,
                                                    tempEstado,
                                                    materialBE.Usuario);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
            }
            return codInsertado;
        }


        /// <summary>
        /// Método              : modificarMaterial
        /// Descripción         : Modifica Material en la BD
        /// Fecha Creacion      : 20/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 20/03/2012
        /// </summary>
        /// <param name="materialBE">Entidad que representa el Material</param>
        /// <param name="transaccionIniciada">Indicador de Transacción Iniciada</param>
        /// <returns>Retorna un booleano que indica si se actualizo el registro</returns>
        public bool modificarMaterial(BEMaterial materialBE,
                                      bool transaccionIniciada)
        {
            bool respuesta = true;

            try
            {
                int? idUnidad = null;
                if (materialBE.Unidad != null)
                {
                    idUnidad = materialBE.Unidad.IdUnidad;
                }

                decimal? tempCosto = (decimal)materialBE.Costo;
                int? tempEstado = (int)materialBE.Estado;

                chilisDataContext.spModificaMaterial(materialBE.IdMaterial,
                                                     materialBE.Descripcion,
                                                     idUnidad,
                                                     tempCosto,
                                                     tempEstado,
                                                     materialBE.Usuario);
            }
            catch (Exception ex)
            {
                respuesta = false;
                throw ex;
            }
            finally
            {
            }
            return respuesta;
        }

        /// <summary>
        /// Método              : eliminarMaterial
        /// Descripción         : Elimina Material en la BD
        /// Fecha Creacion      : 20/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 20/03/2012
        /// </summary>
        /// <param name="materialBE">Entidad que representa el Material</param>
        /// <param name="transaccionIniciada">Indicador de Transacción Iniciada</param>
        /// <returns>Retorna un booleano que indica si se actualizo el registro</returns>
        public bool eliminarMaterial(BEMaterial materialBE,
                                     bool transaccionIniciada)
        {
            bool respuesta = true;

            try
            {
                int? tempEstado = (int)materialBE.Estado;

                chilisDataContext.spEliminaMaterial(materialBE.IdMaterial,
                                                  tempEstado,
                                                  materialBE.Usuario);
            }
            catch (Exception ex)
            {
                respuesta = false;
                throw ex;
            }
            finally
            {
            }
            return respuesta;
        }

        /// <summary>
        /// Método              : obtenerMaterialPorId
        /// Descripción         : Obtiene la Entidad Material
        /// Fecha Creacion      : 20/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 20/03/2012
        /// </summary>
        /// <param name="idMaterial">Id Material</param>
        /// <returns>Retorna el Objeto que representa la Entidad Material</returns>
        public BEMaterial obtenerMaterialPorId(int idMaterial)
        {
            DataSet ds = null;
            BEMaterial materialBE = null;
            this.Conexion();

            cmd = new SqlCommand();
            cmd.Connection = this.connection;
            this.AbrirConexion();

            cmd.CommandText = "spSelMaterialPorId";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();
            cmd.Parameters.Add(new SqlParameter("@pIdMaterial", idMaterial));

            try
            {
                cmd.ExecuteNonQuery();

                ds = new DataSet();
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                da.Fill(ds);

                if (ds != null)
                {
                    materialBE = this.poblarMaterial(ds.Tables[(int)Constantes.MATERIAL_DATOS.DATOS_GENERALES], materialBE);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Dispose();
                this.CerrarConexion();
            }
            return materialBE;
        }

        /// <summary>
        /// Método              : poblarMaterial
        /// Descripción         : Se encarga de poblar los datos obtenidos en la Entidad Material
        /// Fecha Creacion      : 20/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 20/03/2012
        /// </summary>
        /// <param name="dtMaterial">Resultado de la Búsqueda por Id</param>
        /// <param name="materialBE">Entidad que repreenta el Material</param>
        /// <returns>Retorna el Objeto que representa la Entidad Material</returns>
        private BEMaterial poblarMaterial(DataTable dtMaterial, BEMaterial materialBE)
        {
            if (dtMaterial != null && dtMaterial.Rows.Count > 0)
            {
                if (materialBE == null)
                {
                    materialBE = new BEMaterial();
                }

                DataRow drMaterial = dtMaterial.Rows[0];
                if (drMaterial["id_material"] != DBNull.Value)
                {
                    int tempIdMaterial = 0;
                    int.TryParse(drMaterial["id_material"].ToString(), out tempIdMaterial);
                    materialBE.IdMaterial = tempIdMaterial;
                }
                if (drMaterial["descripcion"] != DBNull.Value)
                {
                    materialBE.Descripcion = drMaterial["descripcion"].ToString();
                }
                if (drMaterial["id_unidad"] != DBNull.Value)
                {
                    int tempUnidad = 0;
                    int.TryParse(drMaterial["id_unidad"].ToString(), out tempUnidad);

                    materialBE.Unidad = new BEUnidad();
                    materialBE.Unidad.IdUnidad = tempUnidad;
                }
                if (drMaterial["costo"] != DBNull.Value)
                {
                    double tempCosto = 0;
                    if (double.TryParse(drMaterial["costo"].ToString(), out tempCosto))
                    {
                        materialBE.Costo = tempCosto;
                    }
                }
                if (drMaterial["estado"] != DBNull.Value)
                {
                    materialBE.Estado = Common.Constantes.ObtenerEnumEstado(drMaterial["estado"].ToString());
                }
            }
            return materialBE;
        }


        /// <summary>
        /// Función             : buscarMateriales
        /// Descripción         : Busca los Materiales de acuerdo a los filtros configurados
        /// Fecha Creacion      : 20/03/2012
        /// Creador             : TP2
        /// Ultimo en modificar : TP2
        /// Ultima modificacion : 20/03/2012
        /// </summary>
        /// <param name="filtro">Entidad que representa el Material</param>
        /// <returns>Listado de Materiales de acuerdo al filtro especificado</returns>
        public DataTable buscarMateriales(BEMaterial filtro)
        {
            DataTable dt = new DataTable();
            SqlDataAdapter da = null;
            this.Conexion();
            cmd = new SqlCommand();
            cmd.Connection = this.connection;

            this.AbrirConexion();

            cmd.CommandText = "spListarMaterial";
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Clear();

            cmd.Parameters.Add(new SqlParameter("@pIdMaterial", filtro.IdMaterial));
            cmd.Parameters.Add(new SqlParameter("@pDescripcion", filtro.Descripcion));

            if (filtro.Unidad != null)
            {
                cmd.Parameters.Add(new SqlParameter("@pUnidad", filtro.Unidad.IdUnidad));
            }
            else
            {
                cmd.Parameters.Add(new SqlParameter("@pUnidad", DBNull.Value));
            }

            cmd.Parameters.Add(new SqlParameter("@pCosto", filtro.Costo));

            cmd.Parameters.Add(new SqlParameter("@pEstado", filtro.Estado.ToString("D")));
            cmd.Parameters.Add(new SqlParameter("@pOrderBy", filtro.Order_by));
            cmd.Parameters.Add(new SqlParameter("@pDeForma", filtro.De_forma));

            try
            {
                da = new SqlDataAdapter(cmd);
                da.Fill(dt);
            }
            catch (Exception ex)
            {
                dt = null;
                throw ex;
            }
            finally
            {
                if (da != null)
                {
                    da.Dispose();
                }
                cmd.Dispose();
                this.CerrarConexion();
            }
            return dt;

        }


        #endregion
    }
}
